<pre>
    <?php
    /*
      function SerializarConteudo($arr_par_TagsEPalavras = null) {
      $int_qtdPalavras = 0;
      $boo_reindexaArray;
      $str_palavraTag = '';
      $str_palavraFinal = '';
      $str_padraoAberturaTag = '/^(&lt;){1}[a-z]+(&gt;){1}$/'; //<aaaa>
      $str_padraoFechamentoTag = '/^(&lt;){1}(\/){1}[a-z]+(&gt;){1}$/'; //</aaaa>
      $str_caminhoSerializacao = '';

      $int_qtdPalavras = count($arr_par_TagsEPalavras);

      for ($index = 0; $index < $int_qtdPalavras; $index++) {

      $str_palavraTag = ($arr_par_TagsEPalavras[$index]);
      echo 'Esta com: ' .$arr_par_TagsEPalavras[$index].'<br>';
      if (preg_match($str_padraoAberturaTag,$str_palavraTag)) {
      //Retira a tag do caminho serializado ($str_caminhoSerializacao)
      echo '<br>Verificando: ' .$arr_par_TagsEPalavras[$index].'<br>';

      $str_palavraTag = substr($str_palavraTag, 4, -4);

      $str_caminhoSerializacao = $str_caminhoSerializacao . '>' . $str_palavraTag;

      echo 'Caminho :' . $str_caminhoSerializacao . '<br>';
      } elseif (preg_match($str_padraoFechamentoTag, $str_palavraTag)) {
      //Retira a tag do caminho serializado ($str_caminhoSerializacao)
      $str_palavraTag = substr($str_palavraTag, 5, -4);
      $str_tagAux = substr($str_caminhoSerializacao, -(strlen($str_palavraTag)), strlen($str_caminhoSerializacao));
      flush();
      //                echo 'str_palavraTag='.$str_palavraTag.'<br>str_tagAUx='.$str_tagAux.'<br>';
      echo 'Verificando: < /' . $str_palavraTag . '><br>';
      if ($str_palavraTag == $str_tagAux) {
      echo 'Retirada: ' . $str_tagAux . '<br>';
      $str_caminhoSerializacao = substr($str_caminhoSerializacao, 0, -(1 + strlen($str_tagAux)));
      echo 'Caminho :' . $str_caminhoSerializacao . '<br>';
      $str_palavraTag='';
      $str_tagAux='';
      }
      } else {
      //Adiciona o caminho a palavra
      //Ex.: html>body>div>p>palavra
      }
      }//Final for

      return $arr_par_TagsEPalavras;
      }
     */

//Contar tempo de execução
    function tempoExecucao($start = null) {
        // Calcula o microtime atual
        $mtime = microtime(); // Pega o microtime
        $mtime = explode(' ', $mtime); // Quebra o microtime
        $mtime = $mtime[1] + $mtime[0]; // Soma as partes montando um valor inteiro

        if ($start == null) {
            // Se o parametro não for especificado, retorna o mtime atual
            return $mtime;
        } else {
            // Se o parametro for especificado, retorna o tempo de execução
            return round($mtime - $start, 2);
        }
    }

    function RefinarPalavras($str_par_Codigo) {
        /*
          $arr_padroes = array('/((<script(.*?)*>)(.*?)(<\/script>))/sim', //tag scripts
          '/((<!--)(.*?)(-->))/sim', //Comentarios: <!-- ... -->
          '/((<!)(.*?)(>))/sim', //Doctype <!DOCTYPE html>
          '/((\/\*)(.*?)(\*\/))/sim', //Comentarios /* ... * /
          '/((<noscript(.*?)?>)(.*?)(\/noscript>))/sim', //tag: <noscript>...</noscript>
          '/((<style(.*?)?>)(.*?)(\/style>))/sim', //tag <style>...</style>
          '/(<[a-z]*>)/sim', //abertura tag vazia: <title>
          '/((<[a-zA-Z0-9])(.*?)(>))/sim', //abertura tag cheia: <title id="A">
          '/(<\/[a-zA-Z0-9]*>)/sim', //Fechamento tag vazia: </a>
          '/[\n\r\t]/sim', //Formatações: \n\r\t
          '/\s{1}\s{1,}/sim'); //Espaços duplos seguidos: "_"__"
         */
        $arr_padroes1 = array(
            '/((<!--)(.*?)(-->))/sim', //Comentarios: <!-- ... -->
            '/((<!)(.*?)(>))/sim', //Doctype <!DOCTYPE html>
            '/((\/\*)(.*?)(\*\/))/sim', //Comentarios /* ... * /
            '/((<script(.*?)*>)(.*?)(<\/script>))/sim', //tag scripts
            '/((<noscript(.*?)?>)(.*?)(\/noscript>))/sim', //tag: <noscript>...</noscript>
            '/((<style(.*?)?>)(.*?)(\/style>))/sim', //tag <style>...</style>
            '/((<(\/{0,1})[a-zA-Z0-9]*)(.*?)(>|\/>))/sim', //tag scripts
            '/[\n\r\t]/sim', //Formatações: \n\r\t
            '/(&nbsp;)/sim', //char esecial espaço
            '/\s{1}\s{1,}/sim'); //Espaços duplos seguidos: "_"__"
//converte e traduz a codação
        $str_par_Codigo = html_entity_decode(htmlspecialchars($str_par_Codigo));

        $str_par_Codigo = (trim(preg_replace($arr_padroes1, ' ', $str_par_Codigo)));

        //convertendo para caracteres legiveis
        $str_par_Codigo = htmlentities($str_par_Codigo);

        //Quebrando nos espaços e guardando em array
        //$arr_par_palavras = preg_split('/ /sim', ($str_par_Codigo), -1);
        $arr_par_palavras = explode(' ', $str_par_Codigo);

        echo '<br>Metodo: ExibirPalvras <br>';
        echo 'Itens achados : ' . count($arr_par_palavras) . '<br><br>';

        echo '<pre>';

//  print_r($arr_par_palavras);
        $int_qtdPalavras = count($arr_par_palavras);
        for ($index = 0; $index < $int_qtdPalavras; $index++) {
            echo 'indice: ' . $index . '  -  ' . $arr_par_palavras[$index] . '<br>';
        }

        echo '</pre><hr>';
    }

    function RefinarTagsEPalavras($str_par_Codigo) {

        //EXIBIR PALAVRAS + TAGS VAZIAS
        $arr_padroes1 = array(
            '/((<script(.*?)*>)(.*?)(<\/script>))/sim', //tag scripts
            '/((<!--)(.*?)(-->))/sim', //Comentarios: <!-- ... -->
            '/((<![CDATA[)(.*?)(]]>))/sim', //Comentarios: <![CDATA[...]]>
            '/((\/\*)(.*?)(\*\/))/sim', //Comentarios /* ... * /
            '/((<!)(.*?)(>))/sim', //Doctype <!DOCTYPE html>
            '/((<form(.*?)?>)(.*?)(<\/form>))/sim', //tag: <form>...</form>
            '/((<button(.*?)?>)(.*?)(<\/button>))/sim', //tag: <form>...</form>
            '/((<noscript(.*?)?>)(.*?)(\/noscript>))/sim', //tag: <noscript>...</noscript>
            //'/<br\s*(\/)*>/sim', //tag: <br>|<br >
            '/<br\s*(.*?\s*)*(\/)?>/sim', //tag: <br>|<br >
            '/<hr(\s*.*?)*>/sim', //tag: <br>|<br >
            //'/((<hr(\s.)*>))/sim', //tag: <hr>
//        '/<[a-z0-9-:_]*\s{1}.*\/>/sim', //tag: <hr>
            '/((<img(\s*?).*?(\/>|>)))/sim', //tag: <img .../> ou <img ...>
            '/((<meta(\s*?).*?(\/>|>)))/sim', //tag: <img .../> ou <img ...>
            '/((<link(\s*?).*?(\/>|>)))/sim', //tag: <img .../> ou <img ...>
            '/((<input(\s*?).*?(\/>|>)))/sim', //tag: <img .../> ou <img ...>
            '/((<style(.*?)?>)(.*?)(\/style>))/sim', //tag <style>...</style>
            '/((<iframe(.*?)?>)(.*?)(\/iframe>))/sim', //tag <iframe>...</iframe>
//            '/<{1}[a-z0-9]+.*?(\/>){1}/sim',//<input d="aaa" />
            '/[\t\n\r\f\v]/sim', //Formatações: \n\r\t
            '/(&nbsp;)/sim', //char esecial espaço
            '/\s{2,}/sim');                          //Espaços duplos 
        //Troca por '>'
        $arr_padroes2 = array('/(\s*)>/sim', //retira espaços extras
            '/((\s{1,})([a-zA-Z0-9]*)=.*?(>))/sim', //reparar _href=...> 
            /*
              '/((\s{1,})[a-zA-Z0-9_]*=.*?>)/sim',
             */
            '/(\s*[a-z0-9-:_]*(=)(\".*?\"|\'.*?\'|\s{0}.*?\s{1}))*>/sim', //reparar _href=...>
//      
                //      '/([^<a-zA-Z0-9]*(\s{1})(([a-zA-Z0-9]*)>))/sim'
        ); //Vestigios <html ahdidoj> <html> 

        $arr_padroes3 = array('/></sim'); //reparar >< para > <
        $arr_padroes4 = array('/>s{0}/sim'); //reparar >alou  > alou
        $arr_padroes5 = array('/s{0}</sim'); //reparar  alou<    alou <
        $arr_padroes6 = array('/\s{2,}/sim'); //retira espaços extras
        $arr_padroes7 = array('/(<\/html(.*)*)/sim'); //retira tudo pós html
        $arr_padroes8 = array('/(.*?<html>)/sim'); //retira tudo antes html
//Retira caracteres especiais e converte
        $str_par_Codigo = html_entity_decode(htmlspecialchars($str_par_Codigo));

        $str_par_Codigo = (trim(preg_replace($arr_padroes1, ' ', $str_par_Codigo)));
        $str_par_Codigo = (trim(preg_replace($arr_padroes2, '>', $str_par_Codigo)));
        $str_par_Codigo = (trim(preg_replace($arr_padroes3, '> <', $str_par_Codigo)));
        $str_par_Codigo = (trim(preg_replace($arr_padroes4, '> ', $str_par_Codigo)));
        $str_par_Codigo = (trim(preg_replace($arr_padroes5, ' <', $str_par_Codigo)));
        $str_par_Codigo = (trim(preg_replace($arr_padroes6, ' ', $str_par_Codigo)));
        $str_par_Codigo = (trim(preg_replace($arr_padroes7, '</html>', $str_par_Codigo)));
        $str_par_Codigo = (trim(preg_replace($arr_padroes8, '<html>', $str_par_Codigo)));
        $str_par_Codigo = htmlentities($str_par_Codigo);

        //$arr_par_palavras = preg_split('/ /sim', ($str_par_Codigo), -1);
        $arr_par_palavras = explode(' ', $str_par_Codigo);
        echo '<hr>RefinarTagsEPalavras';
        // print_r($arr_par_palavras);
        echo '<hr>';
        return $arr_par_palavras;
    }

    function RequisitandoCodigoFonte($str_par_site) {

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $str_par_site);
        //Cabeçalho/header de informações
        //curl_setopt($ch, CURLOPT_HEADER, true);
        /*
         * Nega verificação do protocolo HTTPS
         * http://translate.google.com.br/translate?hl=pt-BR&sl=en&u=http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/&prev=/search%3Fq%3Dcurl%2Bcom%2Bhttps%26es_sm%3D93 
         */
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_REFERER, '');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        $str_codigo = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        echo '<br>Codigo HTTP: ' . $str_codigo . '<br>';
        $str_ret_codigoFonteSite = curl_exec($ch);

        return $str_ret_codigoFonteSite;
    }

    function FormatarElemtosVazios($arr_par_TagsEPalavras = null) {
        $int_qtdPalavras = 0;
        $boo_reindexaArray;
        $int_lacoDo = 0;
        $int_lacoFor = 0;
        $str_palavraInicial = '';
        $str_palavraFinal = '';
        $str_padraoAberturaTag = '/^(&lt;){1}[^\/]{1}[a-z]+(&gt;){1}$/'; //<aaaa>
        $str_padraoFechamentoTag = '/^(&lt;){1}(\/){1}[a-z]+(&gt;){1}$/'; //</aaaa>


        do {
            $boo_reindexaArray = false;
            $int_qtdPalavras = count($arr_par_TagsEPalavras) - 1;

            for ($index = 0; $index < $int_qtdPalavras; $index++, $int_lacoFor++) {

                @$str_palavraInicial = ($arr_par_TagsEPalavras[$index]);
                $str_palavraFinal = ($arr_par_TagsEPalavras[$index + 1]);
                /*
                  if ((@preg_match($str_padraoAberturaTag, ($arr_par_TagsEPalavras[$index]))) &
                  (preg_match($str_padraoFechamentoTag, ($arr_par_TagsEPalavras[$index + 1])))) {
                 */

                if ((preg_match($str_padraoAberturaTag, $str_palavraInicial)) &
                        (preg_match($str_padraoFechamentoTag, $str_palavraFinal))) {

                    //Retirando o conteudo da tag
                    $str_palavraInicial = substr($str_palavraInicial, 4, -4);
                    $str_palavraFinal = substr($str_palavraFinal, 5, -4);

                    if ($str_palavraInicial === $str_palavraFinal) {
                        //  echo '<br>Conteudo:' . $str_palavraInicial . ' -- (' . $index.','.($index+1).').';
                        unset($arr_par_TagsEPalavras[$index]);
                        unset($arr_par_TagsEPalavras[($index + 1)]);
                        $boo_reindexaArray = true;
                    }//fim if conteudo
                }//fim if pregmatch
            }//Final for

            /* Reindexa o array retirando os espaços nullo
             * Gerado pelo unset($arr_par_TagsEPalavras[POSICAO]);
             */
            $arr_par_TagsEPalavras = array_values($arr_par_TagsEPalavras);
            flush();
            reset($arr_par_TagsEPalavras);
            //Retorna o ponteiro para a posição 0 do array
            $int_lacoDo++;
        } while ($boo_reindexaArray == true);
        echo '<hr>Passou pelo FOR "' . $int_lacoFor . '" vezes, laco DO "' . $int_lacoDo . '" vezes.<hr>';
        // print_r($arr_par_TagsEPalavras);
        return $arr_par_TagsEPalavras;
    }

    function SerializarConteudo($arr_par_TagsEPalavras = null) {

        $str_palavraTag = '';
        $str_padraoAberturaTag = '/^(&lt;){1}[a-z]+(&gt;){1}$/'; //<aaaa>
        $str_padraoFechamentoTag = '/^(&lt;){1}(\/){1}[a-z]+(&gt;){1}$/'; //</aaaa>
        $arr_caminhoSerializacao = array();
        $int_qtdPalavras = count($arr_par_TagsEPalavras);

        for ($index = 0; $index < $int_qtdPalavras; $index++) {

            //Retira o conteudo do indice do array
            $str_palavraTag = ($arr_par_TagsEPalavras[$index]);

            //Verifica se é tag de ABERTURA
            if (preg_match($str_padraoAberturaTag, $str_palavraTag)) {
                //Serializa e guarda o conteudo para o caminho (>tagHtml)
                $str_palavraTag = substr($str_palavraTag, 4, -4);
                $arr_caminhoSerializacao[] = ('>' . $str_palavraTag);

                echo 'Abre_ :';
                foreach ($arr_caminhoSerializacao as $value) {
                    echo$value;
                }
                echo '<br>';


                //Verifica se é tag de FECHAMENTO
            } elseif (preg_match($str_padraoFechamentoTag, $str_palavraTag)) {

                //Retira o conteudo do indice do array
                $str_palavraTag = substr($str_palavraTag, 5, -4);
                
                //Retira o conteudo do indice do array 
                $str_ultimaPosicArray = $arr_caminhoSerializacao[count($arr_caminhoSerializacao) - 1];
                $str_ultimaPosicArray = substr($str_ultimaPosicArray, 1, strlen($str_ultimaPosicArray));

                flush();

                if ($str_palavraTag == $str_ultimaPosicArray) {
                
                    //Retirando a ultima posicao do caminho
                    $arr_caminhoSerializacao = array_slice($arr_caminhoSerializacao, 0, count($arr_caminhoSerializacao) - 1);

                    echo 'Fecha :';

                    foreach ($arr_caminhoSerializacao as $value) {
                        echo $value;
                    }
                    echo '<br>';
                } else {
                    echo '<hr>Tratamento para < / ' . $str_palavraTag . ' ><br>';
                    
                    $boo_achouTagSolo = false;
                    $int_cont = count($arr_caminhoSerializacao) - 1;
                    for (; $int_cont > 0; $int_cont--) {
                        //Retira a palavra do array junto com o '>'
                        $str_tag = $arr_caminhoSerializacao[$int_cont];
                        $str_tag = substr($str_tag, 1, strlen($str_tag));
                        if ($str_tag == $str_palavraTag) {
                            echo 'Normalizar array posicao: ' . $int_cont.' a '.(count($arr_caminhoSerializacao)-1).'<br>';
                            
                            $boo_achouTagSolo = true;
                            $arr_caminhoSerializacao = array_slice($arr_caminhoSerializacao, 0, $int_cont);
                            echo 'Fecha :';
                            foreach ($arr_caminhoSerializacao as $value) {
                                echo $value;
                            }
                            echo '<br>';
                            break;
                        }
                    }//Final for
                    if(!$boo_achouTagSolo){
                        echo 'Tag problema. (IGNORADA)';
                    }
                    echo '<hr>';
                }
            } else {
                //Adiciona o caminho a palavra
                //Ex.: html>body>div>p>palavra
            }
        }//Final for

        return $arr_par_TagsEPalavras;
    }

    function ExibirFinal($arr_par_TagsEPalavras) {
        $int_qtdPalavras = count($arr_par_TagsEPalavras);
        echo 'Itens achados : ' . count($arr_par_TagsEPalavras) . '<br><br>';
        echo '<pre>';

        for ($index = 0; $index < $int_qtdPalavras; $index++) {
            echo 'indice: ' . $index . '  -  ' . $arr_par_TagsEPalavras[$index] . '<br>';
        }
        echo '</pre><hr>';
    }

    /*
     * @func tempoExecucao()
     *      Retorna o tempo em milisegudos no momento 
     *      que chama o metodo
     * 
     * @var string $str_siteRequisitado
     *      url do site/pagina que vai ser desmebrado 
     *      ex.: www.uol.com.br
     * 
     * @var string $str_codigoFonte
     *      codigo fonte formato string do site/pagina
     *      requisitado
     * 
     * @func filtrarExibirPalavras($$str_codigoFonte)
     *      Recebe o codigo fonte e exibe somente as
     *      palavras vistas pelo usuario em formato array
     * 
     * @func filtrarTagEPalavras($str_codigoFonte)
     *      Recebe o codigo fonte e exibe as
     *      palavras + tags formato array
     */
    $tempo_Inicial = tempoExecucao();
    $str_siteRequisitado = 'http://www.r7.com.br/';

    echo 'Site: ' . $str_siteRequisitado;
    $str_codigoFonte = RequisitandoCodigoFonte($str_siteRequisitado);

    /*
     * Descomente o metodo qual sera exibido o resultado
     * ExibirPalavras  ou  
     */
    $str_codigoFonte = RefinarTagsEPalavras($str_codigoFonte);
//ExibirPalavras($str_codigoFonte);
    $str_codigoFonte = FormatarElemtosVazios($str_codigoFonte);
    $str_codigoFonte = SerializarConteudo($str_codigoFonte);

    //print_r($str_codigoFonte);

    $tempo_Final = tempoExecucao();
    echo '<hr>Tempo Inicial: ' . $tempo_Inicial . '<br>' .
    'Tempo Final  :  ' . $tempo_Final . '<br>' .
    'Diferença:' . ($tempo_Final - $tempo_Inicial);
    ?>
</pre>